package top.xcxdl.rural.utils;

import com.coremedia.iso.IsoFile;
import org.springframework.web.multipart.MultipartFile;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Ding
 * @create 2022/5/24 17:49
 */
public class FileUtil {

    /**
     * 获取视频时长
     *
     * @param multipartFile MultipartFile
     * @param filename      文件路径
     * @param ext           尾缀（.mp4、.wav、.m4a、.mov）
     * @return 视频时长（秒）
     */
    public static long getVideoDuration(MultipartFile multipartFile, String filename, String ext) throws IOException {
        //由于MultipartFile不支持直接读取文件，所以需要将文件写入临时文件
        final File file = File.createTempFile(filename, ext);
        multipartFile.transferTo(file);
        //获取临时文件的绝对路径
        String tempPath = file.getAbsolutePath();
        //获取视频时长
        long duration = 0L;
        if (".wav".equals(ext)) {
            duration = FileUtil.getDuration(tempPath).intValue();
        } else if (".m4a".equals(ext)) {
            duration = FileUtil.getMp4Duration(tempPath);
        } else if (".mov".equals(ext)) {
            duration = FileUtil.getMp4Duration(tempPath);
        } else if (".mp4".equals(ext)) {
            duration = FileUtil.getMp4Duration(tempPath);
        }
        return duration;
    }

    /**
     * 获取视频文件的播放长度(mp4、mov格式)
     *
     * @param videoPath 视频文件路径
     * @return 单位为毫秒
     */
    private static long getMp4Duration(String videoPath) throws IOException {
        IsoFile isoFile = new IsoFile(videoPath);
        return isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
    }

    /**
     * 获取语音文件播放时长(秒) 支持wav 格式
     *
     * @param filePath 文件路径
     * @return 时长（秒）
     */
    private static Float getDuration(String filePath) {
        try {

            File destFile = new File(filePath);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(destFile);
            AudioFormat format = audioInputStream.getFormat();
            long audioFileLength = destFile.length();
            int frameSize = format.getFrameSize();
            float frameRate = format.getFrameRate();
            return (audioFileLength / (frameSize * frameRate));

        } catch (Exception e) {
            e.printStackTrace();
            return 0f;
        }
    }

    /**
     * 得到pcm文件的毫秒数
     * <p>
     * pcm文件音频时长计算
     * 同图像bmp文件一样，pcm文件保存的是未压缩的音频信息。 16bits 编码是指，每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。 16000采样率 是指 1秒钟采样 16000次。常见的音频是44100HZ，即一秒采样44100次。 单声道： 只有一个声道。
     * <p>
     * 根据这些信息，我们可以计算： 1秒的16000采样率音频文件大小是 2*16000 = 32000字节 ，约为32K 1秒的8000采样率音频文件大小是 2*8000 = 16000字节 ，约为 16K
     * <p>
     * 如果已知录音时长，可以根据文件的大小计算采样率是否正常。
     *
     * @param filePath pcm文件路径
     * @return 毫秒数
     */
    private static long getPcmDurationMilliSecond(String filePath) {
        File file = new File(filePath);

        //得到多少秒
        long second = file.length() / 32000;

        long milliSecond = Math.round((file.length() % 32000) / 32000.0 * 1000);

        return second * 1000 + milliSecond;
    }

//    /**
//     * 获取mp3语音文件播放时长(秒) mp3
//     * @param filePath
//     * @return
//     */
//    public static Float getMp3Duration(String filePath){
//
//        try {
//            File mp3File = new File(filePath);
//            MP3File f = (MP3File) AudioFileIO.read(mp3File);
//            MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
//            return Float.parseFloat(audioHeader.getTrackLength()+"");
//        } catch(Exception e) {
//            e.printStackTrace();
//            return 0f;
//        }
//    }

//
//    /**
//     * 获取mp3语音文件播放时长(秒)
//     * @param mp3File
//     * @return
//     */
//    public static Float getMp3Duration(File mp3File){
//
//        try {
//            //File mp3File = new File(filePath);
//            MP3File f = (MP3File) AudioFileIO.read(mp3File);
//            MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
//            return Float.parseFloat(audioHeader.getTrackLength()+"");
//        } catch(Exception e) {
//            e.printStackTrace();
//            return 0f;
//        }
//    }

//    private static void getVideoDurationByHttpUrl() throws IOException {
//        File file = getFileByUrl("https://video-ecook.oss-cn-hangzhou.aliyuncs.com/76bd353630be47f0b5447ec06201ee56.mp4");
//        String path = file.getCanonicalPath(); ;
//        System.out.println(path);
//
//        long result = VideoUtil.getDuration(path);
//        System.out.println(result + "s");
//    }

    private static File getVideoDurationByHttpUrl(String url) throws IOException {
        //根据一个url拆分出文件名和尾缀


//
//        String allFileName = "";
//        try {
//            allFileName = url.split("http://")[1];
//        }catch (Exception e) {
//            allFileName = url.split("https://")[1];
//        }
//        String[] strs = allFileName.split("\\.");
//        String fileName = strs[0];
//        String suffix = strs[1];
//        //创建临时文件
//        final File file = File.createTempFile(fileName, suffix);
//        //获取临时文件的绝对路径
//        String path = file.getCanonicalPath(); ;
//        System.out.println(path);
//        long result = FileUtil.getDuration(path);
//        System.out.println(result + "s");
//        return tmpFile;

        return null;
    }



}
